const readline = require('readline');
const { exec, spawn } = require('child_process');
const { writeVideoList } = require('./utils');

// 默认的推流地址
const DEFAULT_RTMP_URL = 'rtmp://txy2.live-push.bilivideo.com/live-bvc/';

// 创建readline接口
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

// 显示FFmpeg安装指南
function showFFmpegInstallGuide() {
    console.log('\n=== FFmpeg 安装指南 ===');
    console.log('1. Windows安装方法:');
    console.log('   a. 下载FFmpeg: https://www.gyan.dev/ffmpeg/builds/');
    console.log('   b. 解压下载的文件');
    console.log('   c. 将解压后的 bin 目录添加到系统环境变量 Path 中');
    console.log('   d. 重启终端后即可使用');
    console.log('\n2. Mac安装方法:');
    console.log('   使用 Homebrew 安装:');
    console.log('   brew install ffmpeg');
    console.log('\n3. Linux安装方法:');
    console.log('   Ubuntu/Debian:');
    console.log('   sudo apt update && sudo apt install ffmpeg');
    console.log('   CentOS:');
    console.log('   sudo yum install ffmpeg ffmpeg-devel');
    console.log('\n验证安装: 打开终端输入 ffmpeg -version\n');
}

// 检查ffmpeg是否可用
function checkFFmpeg() {
    return new Promise((resolve) => {
        exec('ffmpeg -version', (error) => {
            if (error) {
                console.log('\x1b[31m%s\x1b[0m', '警告: 未检测到FFmpeg！请先安装FFmpeg并确保它在系统环境变量中。');
                // console.log('\x1b[36m%s\x1b[0m', '下载地址: https://ffmpeg.org/download.html');
                showFFmpegInstallGuide();
                resolve(false);
            } else {
                console.log('\x1b[32m%s\x1b[0m', 'FFmpeg已安装并可用');
                resolve(true);
            }
        });
    });
}

// 使用 Promise 封装问答过程
function askQuestion(question) {
    return new Promise((resolve) => {
        rl.question(question, (answer) => {
            resolve(answer);
        });
    });
}

// 等待用户按回车键
function waitForEnter() {
    return new Promise((resolve) => {
        console.log('\n按回车键退出...');
        rl.question('', () => {
            resolve();
        });
    });
}

// 主要的异步函数
async function main() {
    try {
        // 首先检查ffmpeg是否可用
        if(await checkFFmpeg()){
            // 获取地址，显示默认值
            console.log(`默认推流地址: ${DEFAULT_RTMP_URL}`);
            const address = await askQuestion('请输入B站推流地址 (直接回车使用默认地址): ') || DEFAULT_RTMP_URL;
            
            // 获取密钥
            const key = await askQuestion('请输入推流密钥: ');

            // 打印收集到的信息
            console.log('\n收集到的信息：');
            console.log('地址:', address);
            console.log('密钥:', key);

            // 生成视频列表文件
            writeVideoList();

            // 使用 spawn 来执行 ffmpeg 命令以获取实时输出
            const rtmpUrl = `${address}${key}`;
            const ffmpeg = spawn('ffmpeg', [
                '-re',
                '-f', 'concat',
                '-safe', '0',
                '-i', 'videos.txt',
                '-vcodec', 'copy',
                '-acodec', 'copy',
                '-f', 'flv',
                rtmpUrl
            ]);

            // 处理标准输出
            ffmpeg.stdout.on('data', (data) => {
                console.log(`${data}`);
            });

            // 处理标准错误
            ffmpeg.stderr.on('data', (data) => {
                console.error(`${data}`);
            });

            // 处理进程结束
            ffmpeg.on('close', (code) => {
                console.log(`ffmpeg 进程退出，退出码 ${code}`);
            });

            // 等待用户输入
            await waitForEnter();
            
            // 结束 ffmpeg 进程
            ffmpeg.kill();
        } else {
            // FFmpeg 检测失败时等待用户输入后退出
            await waitForEnter();
        }
    } catch (error) {
        console.error('发生错误:', error);
        await waitForEnter();
    } finally {
        rl.close();
        process.exit();
    }
}

// 运行主函数
main(); 